正如前面章节中所看到的，简单的代码会因为内存空间的存在变得复杂。我们可以自由地使用常规C++指针，但有时候需要使用multi\_ptr类，并显式地指定期望支持的地址空间。\par

许多现代体系结构通过为所谓的通用地址空间提供硬件支持来解决这个问题，指针可以指向任何内存空间中的内存，因此我们(和编译器!)可以利用运行时查询，特化不同内存空间需要不同处理的情况下的代码(例如，访问工作组本地内存可能使用不同的指令)。对泛型地址空间的支持在其他编程语言中已经可用，比如OpenCL，预计SYCL的未来版本将采用默认泛型代替推理规则。\par

这一更改将极大地简化许多代码，并使multi\_ptr类成为可选的性能调优特性，而不是正确性所必需的特性。图EP-2显示了一个使用现有地址空间编写的简单类，图EP-3和EP-4显示了通过引入通用地址空间可以实现的两种可选设计。\par

\hspace*{\fill} \par %插入空行
图EP-2 类中存储指向特定地址空间的指针
\begin{lstlisting}[caption={}]
// Pointers in structs must be explicitly decorated with address space
// Supporting both address spaces requires a template parameter
template <access::address_space AddressSpace>
struct Particles {
	multi_ptr<float, AddressSpace> x;
	multi_ptr<float, AddressSpace> y;
	multi_ptr<float, AddressSpace> z;
};
\end{lstlisting}

\hspace*{\fill} \par %插入空行
图EP-3 类中存储指向泛型地址空间的指针
\begin{lstlisting}[caption={}]
// Pointers in structs default to the generic address space
struct Particles {
	float* x;
	float* y;
	float* z;
};
\end{lstlisting}

\hspace*{\fill} \par %插入空行
图EP-4 类中存储带有可选地址空间的指针
\begin{lstlisting}[caption={}]
// Template parameter defaults to generic address space
// User of class can override address space for performance tuning
template <access::address_space AddressSpace =
access::address_space::generic_space>

struct Particles {
	multi_ptr<float, AddressSpace> x;
	multi_ptr<float, AddressSpace> y;
	multi_ptr<float, AddressSpace> z;
};
\end{lstlisting}





















































